// 对结构体数据类型都可以实现 trait
trait Animal {
//     静态方法签名:`Self`表示实现类型(implementor type)
    fn new(name: &'static str) -> Self;
//     实例方法签名:这些方法将返回一个字符串
    fn name(&self) -> &'static str;
    fn noise(&self) -> &'static str;
//     trait提供默认的方法
    fn talk(&self) {
    println!("{} says {}", self.name(), self.noise());
}
}
// 定义一个结构体
struct Sheep {
    name: &'static str,
    naked: bool,
}
// 对结构体实现trait方法
impl Animal for Sheep {
//     `Self`是实现者类型:`Sheep`
    fn new(name: &'static str) -> Self {
        Sheep {
            name: name,
            naked: false,
        }
    }
    fn name(&self) -> &'static str {
        self.name
    }
    fn noise(&self) -> &'static str {
        if self.naked {
            "Maaaaah?"
        } else {
            "Baaaah!"
        }
    }
    // 覆盖默认的方法
    fn talk(&self) {
        println!("{} pauses briefly... {}", self.name, self.noise());
    }
}

// 对结构体方法实现
impl Sheep {
    fn is_naked(&self) -> bool {
        self.naked
    }
    fn shear(&mut self) {
        if self.is_naked() {
            // 实现者可以使用它的 trait 方法。
            println!("{} is already naked...", self.name());
        } else {
            println!("{} gets a haircut!", self.name);
            self.naked = true;
        }
    }
}
fn main() {
    let mut dolly:Sheep = Animal::new("Dolly");
    dolly.talk();
    dolly.shear();
    dolly.talk();

}
